using System;
using System.Threading.Tasks;
using SheLife.Domain.Entities;

namespace SheLife.Domain.Interfaces.Repositories
{
    /// <summary>
    /// 系统提醒日志仓储接口
    /// </summary>
    public interface ISystemReminderLogRepository : IRepository<SystemReminderLog>
    {
        /// <summary>
        /// 根据提醒ID获取提醒日志列表
        /// </summary>
        /// <param name="reminderId">提醒ID</param>
        /// <returns>提醒日志列表</returns>
        Task<IEnumerable<SystemReminderLog>> GetByReminderIdAsync(Guid reminderId);

        /// <summary>
        /// 根据用户ID获取提醒日志列表
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <returns>提醒日志列表</returns>
        Task<IEnumerable<SystemReminderLog>> GetByUserIdAsync(Guid userId);

        /// <summary>
        /// 根据提醒状态获取提醒日志列表
        /// </summary>
        /// <param name="status">提醒状态</param>
        /// <returns>提醒日志列表</returns>
        Task<IEnumerable<SystemReminderLog>> GetByStatusAsync(string status);

        /// <summary>
        /// 根据时间范围获取提醒日志列表
        /// </summary>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <returns>提醒日志列表</returns>
        Task<IEnumerable<SystemReminderLog>> GetByTimeRangeAsync(DateTime startTime, DateTime endTime);

        /// <summary>
        /// 获取提醒日志列表（分页）
        /// </summary>
        /// <param name="pageIndex">页索引</param>
        /// <param name="pageSize">页大小</param>
        /// <param name="reminderId">提醒ID</param>
        /// <param name="userId">用户ID</param>
        /// <param name="status">提醒状态</param>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <returns>提醒日志列表</returns>
        Task<(IEnumerable<SystemReminderLog> Items, int TotalCount)> GetReminderLogsPagedAsync(
            int pageIndex, 
            int pageSize, 
            Guid? reminderId = null, 
            Guid? userId = null, 
            string status = null, 
            DateTime? startTime = null, 
            DateTime? endTime = null);
    }
}